using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
using BussinessLogicTecnoPez.Produccion.Producto;

namespace BussinessLogicTecnoPez.AtencionCliente.Pedido
{
    [Serializable]
    public class DetalleRemito : IEnumerator, IEnumerable
    {
        public DetalleRemito() : base () { }
        /// <summary>
        /// Crea el detalle del remito partiendo del detalle del pedido asociado
        /// </summary>
        /// <param name="objDetalle">Detalle del pedido asociado</param>
        public DetalleRemito(DetallePedido objDetalle)
        {
            bool exist = false;

            foreach (ItemDetallePedido objItem in objDetalle)
            {
                exist = false;
                foreach (ItemDetalleRemito objItemRemito in this.itemList)
                {
                    if (objItem.IdProducto == objItemRemito.IdProducto)
                    {
                        objItemRemito.Cantidad += objItem.Cantidad;
                        exist = true;
                        break;
                    }                    
                }
                if (!exist)
                    this.itemList.Add(new ItemDetalleRemito(objItem));
            }
        }

        ArrayList itemList = new ArrayList();
        int position = -1;

        [DBField("detail", false, false)]//este caso no pongo el nombre del campo en la BD, lo usa para encontrar la coleccion de items.
        public ArrayList ItemList
        {
            get { return itemList; }
            set { itemList = value; }
        }

        //IEnumerator and IEnumerable require these methods.
        public IEnumerator GetEnumerator()
        {
            position = -1;
            return (IEnumerator)this;
        }

        //IEnumerator
        public bool MoveNext()
        {
            position++;
            return (position < itemList.Count);
        }

        //IEnumerable
        public void Reset()
        { position = 0; }

        //IEnumerable
        public object Current
        {
            get { return itemList[position]; }
        }

        public void add(Producto objProducto, decimal cantidad, decimal precio)
        {
            foreach (ItemDetalleRemito objItem in itemList)
            {
                if (objItem.Producto.IdProducto == objProducto.IdProducto)
                    throw new BussinessLogicTecnoPezException("El producto ya ha sido agregado.");
            }
            ItemDetalleRemito objItemPedido = new ItemDetalleRemito(objProducto, cantidad, precio);
            itemList.Add(objItemPedido);
        }

        public void add(ItemDetalleRemito objItem)
        {
            foreach (ItemDetalleRemito auxItem in itemList)
            {
                if (auxItem.Producto.IdProducto == objItem.Producto.IdProducto)
                    throw new BussinessLogicTecnoPezException("El producto ya ha sido agregado.");
            }
            itemList.Add(objItem);
        }
    }
}
